/*Edit_Digit_Virg

O exemplo a seguir leva um Edit (que, via teclado, aceita apenas valores numéricos e backspace) e dois RadioButtons no Form. Quando o usuário dá um clique no RadioButton1, o programa providencia a colocação de uma vírgula a duas casas decimais do final da string numérica. O evento OnKeyPress do Edit possui um código para providenciar o acerto constante da vírgula a duas casas decimais, sempre que houver a inserção ou exclusão de dados.

nota: esse código é apenas exemplificativo, carecendo de alguns acertos para um uso mais profissional.*/

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

//---------------------------------------------------------------------------
// vetor para receber a string
char buffer[100];
 
/*variável para trabalhar na alteração da posição da vírgula*/
char buf;

/*booleana para desabilitar a inclusão de uma segunda vírgula*/
bool virgula = true;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::RadioButton1Click(TObject *Sender)
{
  if(virgula == true && Edit1->Text != "")
    {
      char buffer[100];
      strcpy (buffer, Edit1->Text.c_str());  // converte Text de AnsiString para char*
      buffer[(Edit1->Text.Length()) + 1] = buffer[(Edit1->Text.Length())];
      buffer[(Edit1->Text.Length())]     = buffer[(Edit1->Text.Length())- 1];
      buffer[(Edit1->Text.Length()) - 1] = buffer[(Edit1->Text.Length())- 2];

 

/**************************************************************
Para colocar a vírgula a quatro casas decimais do final,
acrescente as linhas de código que estão na forma de comentários
e substitua os valores na forma de comentários no final de
algumas das linhas de código abaixo: os valores -4, -5 ou -6.
***************************************************************/

 

      // buffer[((int)Edit1->Text.Length()) - 2] = buffer[((int)Edit1->Text.Length())- 3];
      // buffer[((int)Edit1->Text.Length()) - 3] = buffer[((int)Edit1->Text.Length())- 4];

      buffer[(Edit1->Text.Length()) - 2] = ','; // - 4
      Edit1->Text = buffer;
      virgula = false;
    }
  else
   return;

 }
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1MouseUp(TObject *Sender, TMouseButton Button,
      TShiftState Shift, int X, int Y)
{
  // coloca o cursor no final do Edit
  Edit1->SelStart = (Edit1->Text.Length());
}
//---------------------------------------------------------------------------

 

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, char &Key)
{

/***  O código abaixo faz que o edit aceite apenas valores numéricos através do teclado */

// (backspace == 8)


  if(Key != 8)
   {
     // (valor 1 == 48) .. (valor 9 == 57)
     if((Key < 48) || (Key > 57))
       {
         Key = 0;
       }
   }

/*O código abaixo mantém a vírgula a duas casas
decimais (...,00) do final da string *********/


  if(RadioButton1->Checked == true)
    {
      if (Key != VK_BACK) // Key != backspace
        {

          saida:
          // converte Text de AnsiString para char*
          strcpy (buffer, Edit1->Text.c_str());
          buf = buffer[(Edit1->Text.Length()) - 2]; //-4
          buffer[(Edit1->Text.Length()) - 3] = buf; //-5
          buffer[(Edit1->Text.Length()) - 2] = ','; //-4
          Edit1->Text = buffer;

          // coloca o cursor no final do Edit
          Edit1->SelStart = (Edit1->Text.Length());
        }

      if (Key == VK_BACK)
        {
          // converte Text de AnsiString para char*
          strcpy (buffer, Edit1->Text.c_str()); 
          buf = buffer[(Edit1->Text.Length()) - 4]; // -6
          buffer[(Edit1->Text.Length()) - 3] = buf// -5
          buffer[(Edit1->Text.Length()) - 4] = ','; // -6
          Edit1->Text = buffer;

          // coloca o cursor no final do Edit
          Edit1->SelStart = (Edit1->Text.Length());
        }

    }

}
//---------------------------------------------------------------------------